/**
 * Copyright  (c) 2009-2010 Wilmar IT Service,  Inc.   
 * All  rights  reserved. 
 */
package com.wilmar.process.core.services.api;

import java.util.Set;

import com.wilmar.process.entity.SubProcessInstanceRelation;
import com.wilmar.process.entity.vo.SubProcessInstanceRelationVO;
import com.wilmar.process.exception.ObjectNotFoundException;

/**
 * @author makubex Email:makubexnet@gmail.com
 * @version 1.0.0 Jun 17, 2010
 * @since 1.0.0
 */
public interface ISystemSubProcessInstanceRelationService extends
		IBaseService<SubProcessInstanceRelationVO, SubProcessInstanceRelation> {
	/**
	 * 保存子流程关系
	 * 
	 * @param subProcessInstanceRelation
	 *            子流程关系实体
	 */
	public void saveRelation(
			SubProcessInstanceRelation subProcessInstanceRelation);

	/**
	 * 删除父子关系
	 * 
	 * @param parentInstanceExid
	 *            父流程编号
	 * @param subInstanceExid
	 *            子流程编号
	 */
	public void removeRelation(String parentInstanceExid, String subInstanceExid);
	
	/**
	 * 删除父子关系
	 * 
	 * @param subInstanceExid
	 *            子流程编号
	 */
	public void removeRelation(String subInstanceExid);

	/**
	 * 获取详细信息
	 * 
	 * @param relationId
	 *            关系编号
	 * @return 关系详细信息
	 * @throws ObjectNotFoundException
	 *             如果没有找到对应的详细信息
	 */
	public SubProcessInstanceRelation getDetail(Long relationId)
			throws ObjectNotFoundException;

	/**
	 * 删除关于子流程的全部关系
	 * 
	 * @param parentInstanceExid
	 *            父流程编号
	 */
	public void removeAllRelation(String parentInstanceExid);

	/**
	 * 获取所有子流程（包括子流程的子流程）的流程编号
	 * 
	 * @param parentInstanceExid
	 *            父流程编号
	 * @return 子流程编号集合
	 * @throws ObjectNotFoundException
	 *             如果没有任何子流程
	 */
	public Set<String> findAllSubInstanceExids(String parentInstanceExid)
			throws ObjectNotFoundException;

	/**
	 * 获取直接子流程（不包括子流程的子流程）的流程编号
	 * 
	 * @param parentInstanceExid
	 *            父流程编号
	 * @return 直接子流程编号集合
	 * @throws ObjectNotFoundException
	 *             如果没有任何子流程
	 */
	public Set<String> findSubInstanceExids(String parentInstanceExid)
			throws ObjectNotFoundException;

	/**
	 * 获取直接父流程（不包括父流程的父流程）编号
	 * 
	 * @param subInstanceExid
	 *            子流程编号
	 * @return 直接父流程编号
	 * @throws ObjectNotFoundException
	 *             如果不存在父流程
	 */
	public String findParentInstanceExid(String subInstanceExid)
			throws ObjectNotFoundException;

	/**
	 * 获取根流程编号
	 * 
	 * @param subInstanceExid
	 *            子流程编号
	 * @return 根流程编号
	 * @throws ObjectNotFoundException
	 *             如果不存在父流程
	 */
	public String findRootInstanceExid(String subInstanceExid)
			throws ObjectNotFoundException;
}
